home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / formatter.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  17KB  |  616 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. """Generic output formatting.
  5.  
  6. Formatter objects transform an abstract flow of formatting events into
  7. specific output events on writer objects. Formatters manage several stack
  8. structures to allow various properties of a writer object to be changed and
  9. restored; writers need not be able to handle relative changes nor any sort
  10. of ``change back'' operation. Specific writer properties which may be
  11. controlled via formatter objects are horizontal alignment, font, and left
  12. margin indentations. A mechanism is provided which supports providing
  13. arbitrary, non-exclusive style settings to a writer as well. Additional
  14. interfaces facilitate formatting events which are not reversible, such as
  15. paragraph separation.
  16.  
  17. Writer objects encapsulate device interfaces. Abstract devices, such as
  18. file formats, are supported as well as physical devices. The provided
  19. implementations all work with abstract devices. The interface makes
  20. available mechanisms for setting the properties which formatter objects
  21. manage and inserting data into the output.
  22. """
  23. import sys
  24. AS_IS = None
  25.  
  26. class NullFormatter:
  27.     """A formatter which does nothing.
  28.  
  29.     If the writer parameter is omitted, a NullWriter instance is created.
  30.     No methods of the writer are called by NullFormatter instances.
  31.  
  32.     Implementations should inherit from this class if implementing a writer
  33.     interface but don't need to inherit any implementation.
  34.  
  35.     """
  36.     
  37.     def __init__(self, writer = None):
  38.         if writer is None:
  39.             writer = NullWriter()
  40.         
  41.         self.writer = writer
  42.  
  43.     
  44.     def end_paragraph(self, blankline):
  45.         pass
  46.  
  47.     
  48.     def add_line_break(self):
  49.         pass
  50.  
  51.     
  52.     def add_hor_rule(self, *args, **kw):
  53.         pass
  54.  
  55.     
  56.     def add_label_data(self, format, counter, blankline = None):
  57.         pass
  58.  
  59.     
  60.     def add_flowing_data(self, data):
  61.         pass
  62.  
  63.     
  64.     def add_literal_data(self, data):
  65.         pass
  66.  
  67.     
  68.     def flush_softspace(self):
  69.         pass
  70.  
  71.     
  72.     def push_alignment(self, align):
  73.         pass
  74.  
  75.     
  76.     def pop_alignment(self):
  77.         pass
  78.  
  79.     
  80.     def push_font(self, x):
  81.         pass
  82.  
  83.     
  84.     def pop_font(self):
  85.         pass
  86.  
  87.     
  88.     def push_margin(self, margin):
  89.         pass
  90.  
  91.     
  92.     def pop_margin(self):
  93.         pass
  94.  
  95.     
  96.     def set_spacing(self, spacing):
  97.         pass
  98.  
  99.     
  100.     def push_style(self, *styles):
  101.         pass
  102.  
  103.     
  104.     def pop_style(self, n = 1):
  105.         pass
  106.  
  107.     
  108.     def assert_line_data(self, flag = 1):
  109.         pass
  110.  
  111.  
  112.  
  113. class AbstractFormatter:
  114.     '''The standard formatter.
  115.  
  116.     This implementation has demonstrated wide applicability to many writers,
  117.     and may be used directly in most circumstances.  It has been used to
  118.     implement a full-featured World Wide Web browser.
  119.  
  120.     '''
  121.     
  122.     def __init__(self, writer):
  123.         self.writer = writer
  124.         self.align = None
  125.         self.align_stack = []
  126.         self.font_stack = []
  127.         self.margin_stack = []
  128.         self.spacing = None
  129.         self.style_stack = []
  130.         self.nospace = 1
  131.         self.softspace = 0
  132.         self.para_end = 1
  133.         self.parskip = 0
  134.         self.hard_break = 1
  135.         self.have_label = 0
  136.  
  137.     
  138.     def end_paragraph(self, blankline):
  139.         if not self.hard_break:
  140.             self.writer.send_line_break()
  141.             self.have_label = 0
  142.         
  143.         if self.parskip < blankline and not (self.have_label):
  144.             self.writer.send_paragraph(blankline - self.parskip)
  145.             self.parskip = blankline
  146.             self.have_label = 0
  147.         
  148.         self.hard_break = self.nospace = self.para_end = 1
  149.         self.softspace = 0
  150.  
  151.     
  152.     def add_line_break(self):
  153.         if not self.hard_break or self.para_end:
  154.             self.writer.send_line_break()
  155.             self.have_label = self.parskip = 0
  156.         
  157.         self.hard_break = self.nospace = 1
  158.         self.softspace = 0
  159.  
  160.     
  161.     def add_hor_rule(self, *args, **kw):
  162.         if not self.hard_break:
  163.             self.writer.send_line_break()
  164.         
  165.         self.writer.send_hor_rule(*args, **kw)
  166.         self.hard_break = self.nospace = 1
  167.         self.have_label = self.para_end = self.softspace = self.parskip = 0
  168.  
  169.     
  170.     def add_label_data(self, format, counter, blankline = None):
  171.         if self.have_label or not (self.hard_break):
  172.             self.writer.send_line_break()
  173.         
  174.         if not self.para_end:
  175.             if not blankline or 1:
  176.                 pass
  177.             self.writer.send_paragraph(0)
  178.         
  179.         if isinstance(format, str):
  180.             self.writer.send_label_data(self.format_counter(format, counter))
  181.         else:
  182.             self.writer.send_label_data(format)
  183.         self.nospace = self.have_label = self.hard_break = self.para_end = 1
  184.         self.softspace = self.parskip = 0
  185.  
  186.     
  187.     def format_counter(self, format, counter):
  188.         label = ''
  189.         for c in format:
  190.             None if c == '1' else counter > 0
  191.             if c in 'iI':
  192.                 if counter > 0:
  193.                     label = label + self.format_roman(c, counter)
  194.                 
  195.             counter > 0
  196.             label = label + c
  197.         
  198.         return label
  199.  
  200.     
  201.     def format_letter(self, case, counter):
  202.         label = ''
  203.         while counter > 0:
  204.             (counter, x) = divmod(counter - 1, 26)
  205.             s = chr(ord(case) + x)
  206.             label = s + label
  207.         return label
  208.  
  209.     
  210.     def format_roman(self, case, counter):
  211.         ones = [
  212.             'i',
  213.             'x',
  214.             'c',
  215.             'm']
  216.         fives = [
  217.             'v',
  218.             'l',
  219.             'd']
  220.         (label, index) = ('', 0)
  221.         while counter > 0:
  222.             (counter, x) = divmod(counter, 10)
  223.             if x == 9:
  224.                 label = ones[index] + ones[index + 1] + label
  225.             elif x == 4:
  226.                 label = ones[index] + fives[index] + label
  227.             elif x >= 5:
  228.                 s = fives[index]
  229.                 x = x - 5
  230.             else:
  231.                 s = ''
  232.             s = s + ones[index] * x
  233.             label = s + label
  234.             index = index + 1
  235.         if case == 'I':
  236.             return label.upper()
  237.         
  238.         return label
  239.  
  240.     
  241.     def add_flowing_data(self, data):
  242.         if not data:
  243.             return None
  244.         
  245.         prespace = data[:1].isspace()
  246.         postspace = data[-1:].isspace()
  247.         data = ' '.join(data.split())
  248.         if self.nospace and not data:
  249.             return None
  250.         elif prespace or self.softspace:
  251.             if not data:
  252.                 if not self.nospace:
  253.                     self.softspace = 1
  254.                     self.parskip = 0
  255.                 
  256.                 return None
  257.             
  258.             if not self.nospace:
  259.                 data = ' ' + data
  260.             
  261.         
  262.         self.hard_break = self.nospace = self.para_end = self.parskip = self.have_label = 0
  263.         self.softspace = postspace
  264.         self.writer.send_flowing_data(data)
  265.  
  266.     
  267.     def add_literal_data(self, data):
  268.         if not data:
  269.             return None
  270.         
  271.         if self.softspace:
  272.             self.writer.send_flowing_data(' ')
  273.         
  274.         self.hard_break = data[-1:] == '\n'
  275.         self.nospace = self.para_end = self.softspace = self.parskip = self.have_label = 0
  276.         self.writer.send_literal_data(data)
  277.  
  278.     
  279.     def flush_softspace(self):
  280.         if self.softspace:
  281.             self.hard_break = self.para_end = self.parskip = self.have_label = self.softspace = 0
  282.             self.nospace = 1
  283.             self.writer.send_flowing_data(' ')
  284.         
  285.  
  286.     
  287.     def push_alignment(self, align):
  288.         if align and align != self.align:
  289.             self.writer.new_alignment(align)
  290.             self.align = align
  291.             self.align_stack.append(align)
  292.         else:
  293.             self.align_stack.append(self.align)
  294.  
  295.     
  296.     def pop_alignment(self):
  297.         if self.align_stack:
  298.             del self.align_stack[-1]
  299.         
  300.         if self.align_stack:
  301.             self.align = align = self.align_stack[-1]
  302.             self.writer.new_alignment(align)
  303.         else:
  304.             self.align = None
  305.             self.writer.new_alignment(None)
  306.  
  307.     
  308.     def push_font(self, .2):
  309.         (size, i, b, tt) = .2
  310.         if self.softspace:
  311.             self.hard_break = self.para_end = self.softspace = 0
  312.             self.nospace = 1
  313.             self.writer.send_flowing_data(' ')
  314.         
  315.         if self.font_stack:
  316.             (csize, ci, cb, ctt) = self.font_stack[-1]
  317.             if size is AS_IS:
  318.                 size = csize
  319.             
  320.             if i is AS_IS:
  321.                 i = ci
  322.             
  323.             if b is AS_IS:
  324.                 b = cb
  325.             
  326.             if tt is AS_IS:
  327.                 tt = ctt
  328.             
  329.         
  330.         font = (size, i, b, tt)
  331.         self.font_stack.append(font)
  332.         self.writer.new_font(font)
  333.  
  334.     
  335.     def pop_font(self):
  336.         if self.font_stack:
  337.             del self.font_stack[-1]
  338.         
  339.         if self.font_stack:
  340.             font = self.font_stack[-1]
  341.         else:
  342.             font = None
  343.         self.writer.new_font(font)
  344.  
  345.     
  346.     def push_margin(self, margin):
  347.         self.margin_stack.append(margin)
  348.         fstack = filter(None, self.margin_stack)
  349.         if not margin and fstack:
  350.             margin = fstack[-1]
  351.         
  352.         self.writer.new_margin(margin, len(fstack))
  353.  
  354.     
  355.     def pop_margin(self):
  356.         if self.margin_stack:
  357.             del self.margin_stack[-1]
  358.         
  359.         fstack = filter(None, self.margin_stack)
  360.         if fstack:
  361.             margin = fstack[-1]
  362.         else:
  363.             margin = None
  364.         self.writer.new_margin(margin, len(fstack))
  365.  
  366.     
  367.     def set_spacing(self, spacing):
  368.         self.spacing = spacing
  369.         self.writer.new_spacing(spacing)
  370.  
  371.     
  372.     def push_style(self, *styles):
  373.         if self.softspace:
  374.             self.hard_break = self.para_end = self.softspace = 0
  375.             self.nospace = 1
  376.             self.writer.send_flowing_data(' ')
  377.         
  378.         for style in styles:
  379.             self.style_stack.append(style)
  380.         
  381.         self.writer.new_styles(tuple(self.style_stack))
  382.  
  383.     
  384.     def pop_style(self, n = 1):
  385.         del self.style_stack[-n:]
  386.         self.writer.new_styles(tuple(self.style_stack))
  387.  
  388.     
  389.     def assert_line_data(self, flag = 1):
  390.         self.nospace = self.hard_break = not flag
  391.         self.para_end = self.parskip = self.have_label = 0
  392.  
  393.  
  394.  
  395. class NullWriter:
  396.     '''Minimal writer interface to use in testing & inheritance.
  397.  
  398.     A writer which only provides the interface definition; no actions are
  399.     taken on any methods.  This should be the base class for all writers
  400.     which do not need to inherit any implementation methods.
  401.  
  402.     '''
  403.     
  404.     def __init__(self):
  405.         pass
  406.  
  407.     
  408.     def flush(self):
  409.         pass
  410.  
  411.     
  412.     def new_alignment(self, align):
  413.         pass
  414.  
  415.     
  416.     def new_font(self, font):
  417.         pass
  418.  
  419.     
  420.     def new_margin(self, margin, level):
  421.         pass
  422.  
  423.     
  424.     def new_spacing(self, spacing):
  425.         pass
  426.  
  427.     
  428.     def new_styles(self, styles):
  429.         pass
  430.  
  431.     
  432.     def send_paragraph(self, blankline):
  433.         pass
  434.  
  435.     
  436.     def send_line_break(self):
  437.         pass
  438.  
  439.     
  440.     def send_hor_rule(self, *args, **kw):
  441.         pass
  442.  
  443.     
  444.     def send_label_data(self, data):
  445.         pass
  446.  
  447.     
  448.     def send_flowing_data(self, data):
  449.         pass
  450.  
  451.     
  452.     def send_literal_data(self, data):
  453.         pass
  454.  
  455.  
  456.  
  457. class AbstractWriter(NullWriter):
  458.     '''A writer which can be used in debugging formatters, but not much else.
  459.  
  460.     Each method simply announces itself by printing its name and
  461.     arguments on standard output.
  462.  
  463.     '''
  464.     
  465.     def new_alignment(self, align):
  466.         print 'new_alignment(%r)' % (align,)
  467.  
  468.     
  469.     def new_font(self, font):
  470.         print 'new_font(%r)' % (font,)
  471.  
  472.     
  473.     def new_margin(self, margin, level):
  474.         print 'new_margin(%r, %d)' % (margin, level)
  475.  
  476.     
  477.     def new_spacing(self, spacing):
  478.         print 'new_spacing(%r)' % (spacing,)
  479.  
  480.     
  481.     def new_styles(self, styles):
  482.         print 'new_styles(%r)' % (styles,)
  483.  
  484.     
  485.     def send_paragraph(self, blankline):
  486.         print 'send_paragraph(%r)' % (blankline,)
  487.  
  488.     
  489.     def send_line_break(self):
  490.         print 'send_line_break()'
  491.  
  492.     
  493.     def send_hor_rule(self, *args, **kw):
  494.         print 'send_hor_rule()'
  495.  
  496.     
  497.     def send_label_data(self, data):
  498.         print 'send_label_data(%r)' % (data,)
  499.  
  500.     
  501.     def send_flowing_data(self, data):
  502.         print 'send_flowing_data(%r)' % (data,)
  503.  
  504.     
  505.     def send_literal_data(self, data):
  506.         print 'send_literal_data(%r)' % (data,)
  507.  
  508.  
  509.  
  510. class DumbWriter(NullWriter):
  511.     '''Simple writer class which writes output on the file object passed in
  512.     as the file parameter or, if file is omitted, on standard output.  The
  513.     output is simply word-wrapped to the number of columns specified by
  514.     the maxcol parameter.  This class is suitable for reflowing a sequence
  515.     of paragraphs.
  516.  
  517.     '''
  518.     
  519.     def __init__(self, file = None, maxcol = 72):
  520.         if not file:
  521.             pass
  522.         self.file = sys.stdout
  523.         self.maxcol = maxcol
  524.         NullWriter.__init__(self)
  525.         self.reset()
  526.  
  527.     
  528.     def reset(self):
  529.         self.col = 0
  530.         self.atbreak = 0
  531.  
  532.     
  533.     def send_paragraph(self, blankline):
  534.         self.file.write('\n' * blankline)
  535.         self.col = 0
  536.         self.atbreak = 0
  537.  
  538.     
  539.     def send_line_break(self):
  540.         self.file.write('\n')
  541.         self.col = 0
  542.         self.atbreak = 0
  543.  
  544.     
  545.     def send_hor_rule(self, *args, **kw):
  546.         self.file.write('\n')
  547.         self.file.write('-' * self.maxcol)
  548.         self.file.write('\n')
  549.         self.col = 0
  550.         self.atbreak = 0
  551.  
  552.     
  553.     def send_literal_data(self, data):
  554.         self.file.write(data)
  555.         i = data.rfind('\n')
  556.         if i >= 0:
  557.             self.col = 0
  558.             data = data[i + 1:]
  559.         
  560.         data = data.expandtabs()
  561.         self.col = self.col + len(data)
  562.         self.atbreak = 0
  563.  
  564.     
  565.     def send_flowing_data(self, data):
  566.         if not data:
  567.             return None
  568.         
  569.         if not self.atbreak:
  570.             pass
  571.         atbreak = data[0].isspace()
  572.         col = self.col
  573.         maxcol = self.maxcol
  574.         write = self.file.write
  575.         for word in data.split():
  576.             if atbreak:
  577.                 if col + len(word) >= maxcol:
  578.                     write('\n')
  579.                     col = 0
  580.                 else:
  581.                     write(' ')
  582.                     col = col + 1
  583.             
  584.             write(word)
  585.             col = col + len(word)
  586.             atbreak = 1
  587.         
  588.         self.col = col
  589.         self.atbreak = data[-1].isspace()
  590.  
  591.  
  592.  
  593. def test(file = None):
  594.     w = DumbWriter()
  595.     f = AbstractFormatter(w)
  596.     if file is not None:
  597.         fp = open(file)
  598.     elif sys.argv[1:]:
  599.         fp = open(sys.argv[1])
  600.     else:
  601.         fp = sys.stdin
  602.     while None:
  603.         line = fp.readline()
  604.         if not line:
  605.             break
  606.         
  607.         if line == '\n':
  608.             f.end_paragraph(1)
  609.             continue
  610.         f.add_flowing_data(line)
  611.     f.end_paragraph(0)
  612.  
  613. if __name__ == '__main__':
  614.     test()
  615.  
  616.